#pragma once

class CMILMatrix;


class CMILMatrix4x4
{
public: 
	CMILMatrix4x4(const CMILMatrix4x4 * pOther);
	CMILMatrix4x4(bool fInitialize);
	CMILMatrix4x4();
	void SetToIdentity();
	bool IsIdentity();
	void SetToRotationX(XFLOAT rAngle);
	void SetToRotationY(XFLOAT rAngle);
	void SetToRotationZ(XFLOAT rAngle);
	void SetToScale(XFLOAT rScaleX, XFLOAT rScaleY, XFLOAT rScaleZ);
	void SetToTranslation(XFLOAT rTranslateX, XFLOAT rTranslateY, XFLOAT rTranslateZ);
	void SetToPerspective(XFLOAT rNear, XFLOAT rFar, XFLOAT rFieldOfView, XFLOAT rAspectRatio, XBOOL bRightHanded);
	void SetTo2DTransform(const CMILMatrix * pmat2D);
	void Get2DScaleTransform(const struct XSIZEF & elementSize, CMILMatrix * p2DScale);
	void Transform2DPoints_DivideW(const struct XPOINTF * srcPoints, struct XPOINTF * destPoints, XUINT32 count, XBOOL * pAreAllWValuesPositive);
	void TransformBoundsIgnoreZ(const struct XRECTF_WH * pSource, struct XRECTF_WH * pTarget);
	void Append(const CMILMatrix & that);
	void Append(const CMILMatrix4x4 & that);
	void Prepend(const CMILMatrix4x4 & that);
	XFLOAT GetM11();
	XFLOAT GetM12();
	XFLOAT GetM13();
	XFLOAT GetM14();
	XFLOAT GetM21();
	XFLOAT GetM22();
	XFLOAT GetM23();
	XFLOAT GetM24();
	XFLOAT GetM31();
	XFLOAT GetM32();
	XFLOAT GetM33();
	XFLOAT GetM34();
	XFLOAT GetM41();
	XFLOAT GetM42();
	XFLOAT GetM43();
	XFLOAT GetM44();
	void SetM11(XFLOAT r);
	void SetM12(XFLOAT r);
	void SetM13(XFLOAT r);
	void SetM14(XFLOAT r);
	void SetM21(XFLOAT r);
	void SetM22(XFLOAT r);
	void SetM23(XFLOAT r);
	void SetM24(XFLOAT r);
	void SetM31(XFLOAT r);
	void SetM32(XFLOAT r);
	void SetM33(XFLOAT r);
	void SetM34(XFLOAT r);
	void SetM41(XFLOAT r);
	void SetM42(XFLOAT r);
	void SetM43(XFLOAT r);
	void SetM44(XFLOAT r);
	XUINT32 operator==(const CMILMatrix4x4 & other);
	XUINT32 operator!=(const CMILMatrix4x4 & other);
	XFLOAT _11;
	XFLOAT _12;
	XFLOAT _13;
	XFLOAT _14;
	XFLOAT _21;
	XFLOAT _22;
	XFLOAT _23;
	XFLOAT _24;
	XFLOAT _31;
	XFLOAT _32;
	XFLOAT _33;
	XFLOAT _34;
	XFLOAT _41;
	XFLOAT _42;
	XFLOAT _43;
	XFLOAT _44;
	XFLOAT m[4][4];
};

